package io.github.hadyang.leetcode.bytedance;

/**
 * 环形链表 II 给定一个链表，返回链表开始入环的第一个节点。 如果链表无环，则返回 null。
 *
 * <p>为了表示给定链表中的环，我们使用整数 pos 来表示链表尾连接到链表中的位置（索引从 0 开始）。 如果 pos 是 -1，则在该链表中没有环。
 *
 * <p>说明：不允许修改给定的链表。
 *
 * @author haoyang.shi
 */
public class Link1023 {

  /**
   * 先确定有环，再找起点
   *
   * <p>https://blog.csdn.net/qq_26410101/article/details/80430411
   *
   * @param head
   * @return
   */
  public ListNode detectCycle(ListNode head) {
    ListNode fast = head, slow = head;

    ListNode meetNode = null;
    while (fast != null && fast.next != null) {
      fast = fast.next.next;
      slow = slow.next;

      if (fast == slow) {
        meetNode = fast;
        break;
      }
    }

    if (meetNode == null) {
      return meetNode;
    }

    while (head != meetNode) {
      head = head.next;
      if (head == meetNode) {
        break;
      }

      meetNode = meetNode.next;
    }

    return meetNode;
  }

  private static class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
      val = x;
    }

    @Override
    public String toString() {
      return "ListNode{" + "val=" + val + '}';
    }
  }

  public static void main(String[] args) {
    int[] ints = {-1, -7, 7, -4, 19, 6, -9, -5, -2, -5};
    int pos = 6;

    ListNode head = new ListNode(ints[0]);
    ListNode portalNode = null;
    ListNode cur = head;
    for (int i = 1; i < ints.length; i++) {
      ListNode next = new ListNode(ints[i]);
      cur.next = next;
      cur = cur.next;

      if (i == pos) {
        portalNode = next;
      }
    }

    cur.next = portalNode;

    Link1023 main = new Link1023();
    System.out.println(main.detectCycle(head));
  }
}
